package com.rybbaby.tss.core.utils;

import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import com.thoughtworks.xstream.XStream;

/**
 * @description 向外部提供的API请求响应
 * 
 * @author 谢进伟
 * 
 * @createDate 2016-1-29 下午3:12:12
 */
public class APIResponse extends AjaxJsonResponse {
	
	public APIResponse (){
		
	}
	
	/**
	 * @param resMsg
	 *            响应文本信息
	 * @param resCode
	 *            响应码
	 * @param data
	 *            响应的业务数据 <span
	 *            style="color:red">该参数只接受以下类型数据结构：<br>
	 *            List&lt;T&gt;、
	 *            List&lt;Map&lt;String,
	 *            Object&gt;&gt;、Map&lt;String,Object&gt;</span>
	 * @param pageNo
	 *            业务数据分页模式下的当前页码
	 * @param pageSize
	 *            业务数据分页模式下每页显示的记录数
	 */
	public APIResponse (String resMsg , int resCode , Object data , Integer pageNo , Integer pageSize ){
		super();
		this.resMsg = resMsg;
		this.resCode = resCode;
		this.data = data;
		this.checkDataType();
		this.pageNo = pageNo;
		this.pageSize = pageSize;
	}
	
	/**
	 * @param resMsg
	 *            响应文本信息
	 * @param resCode
	 *            响应码
	 * @param data
	 *            响应的业务数据 <span
	 *            style="color:red">该参数只接受以下类型数据结构：<br>
	 *            List&lt;T&gt;、
	 *            List&lt;Map&lt;String,
	 *            Object&gt;&gt;、Map&lt;String,Object&gt;</span>
	 * @param pageNo
	 *            业务数据分页模式下的当前页码
	 * @param pageSize
	 *            业务数据分页模式下每页显示的记录数
	 * @param isPaging
	 *            是否分页
	 */
	public APIResponse (String resMsg , int resCode , Object data , Integer pageNo , Integer pageSize , boolean isPaging ){
		this(resMsg , resCode , data , pageNo , pageSize);
		this.isPaging = isPaging;
	}
	
	/**
	 * @param resMsg
	 *            响应文本信息
	 * @param resCode
	 *            响应码
	 * @param data
	 *            响应的业务数据 <span
	 *            style="color:red">该参数只接受以下类型数据结构：<br>
	 *            List&lt;T&gt;、
	 *            List&lt;Map&lt;String,
	 *            Object&gt;&gt;、Map&lt;String,Object&gt;</span>
	 * @param pageNo
	 *            业务数据分页模式下的当前页码
	 * @param pageSize
	 *            业务数据分页模式下每页显示的记录数
	 * @param extendParams
	 *            扩展参数
	 */
	public APIResponse (String resMsg , int resCode , Object data , Integer pageNo , Integer pageSize , Map<String , Object> extendParams ){
		this(resMsg , resCode , data , pageNo , pageSize);
		this.extendParams = extendParams;
	}
	
	/**
	 * @param resMsg
	 *            响应文本信息
	 * @param resCode
	 *            响应码
	 * @param data
	 *            响应的业务数据 <span
	 *            style="color:red">该参数只接受以下类型数据结构：<br>
	 *            List&lt;T&gt;、
	 *            List&lt;Map&lt;String,
	 *            Object&gt;&gt;、Map&lt;String,Object&gt;</span>
	 * @param pageNo
	 *            业务数据分页模式下的当前页码
	 * @param pageSize
	 *            业务数据分页模式下每页显示的记录数
	 * @param extendParams
	 *            扩展参数
	 * @param isPaging
	 *            是否分页
	 */
	public APIResponse (String resMsg , int resCode , Object data , Integer pageNo , Integer pageSize , Map<String , Object> extendParams , boolean isPaging ){
		this(resMsg , resCode , data , pageNo , pageSize , isPaging);
		this.extendParams = extendParams;
	}
	
	/**
	 * 响应API请求
	 * 
	 * @param isIncludeData
	 *            是否包含业务数据
	 * @return
	 */
	public String xmlResponse(boolean isIncludeData) {
		XStream xstream = new XStream();
		checkPagingParam();
		String resultXmlStr = "<Result><resMsg>服务器端异常</resMsg><resCode>500</resCode></Result>";// 默认响应xml字符串串
		try {
			xstream.alias("Result" , APIResponse.class);
			resultXmlStr = xstream.toXML(this);
			Document document = DocumentHelper.parseText(resultXmlStr);
			Element rootElement = document.getRootElement();
			if(!isIncludeData) {
				removeNode(rootElement , "data");
			}
			if(this.extendParams == null || this.extendParams.size() == 0) {
				removeNode(rootElement , "extendParams");
			}
			if(!this.isPaging) {// 非分页模式
				removeNode(rootElement , "pageNo");
				removeNode(rootElement , "pageSize");
			}
			removeNode(rootElement , "isPaging");
			resultXmlStr = document.asXML().replaceAll("\\n" , "").replaceAll(">\\s*<" , "><");// 压缩xml字符串
		} catch (Exception e) {
			e.printStackTrace();
		}
		return resultXmlStr;
	}
	
	/**
	 * 移除节点
	 * 
	 * @param rootElement
	 *            根节点
	 * @param nodeName
	 *            要移除的节点名称
	 * @return
	 */
	private void removeNode(Element rootElement , String nodeName) {
		Element element = rootElement.element(nodeName);
		if(element != null) {
			rootElement.remove(element);
			element.detach();
		}
	}
}
